package fr.charlesen.projets.utt.lo09.sessionBeans;

import fr.charlesen.projets.utt.lo09.entites.Enseignantsuiveur;
import fr.charlesen.projets.utt.lo09.entites.Etudiants;
import fr.charlesen.projets.utt.lo09.entites.Stages;
import fr.charlesen.projets.utt.lo09.facades.EnseignantsuiveurFacadeLocal;
import fr.charlesen.projets.utt.lo09.facades.EtudiantsFacadeLocal;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.Query;

/**
 *
 * @author Charles EDOU NZE
 */
@Stateless
public class ProgrammeBoss implements ProgrammeBossLocal {

    @EJB
    private EnseignantsuiveurFacadeLocal suiveurFacade;
    @EJB
    private EtudiantsFacadeLocal etudiantFacade;
    private EntityManager em;

    /*
     * ======================================================================*
     * Methodes métiers - Gestion des fonctions de base : F1, F2, F3, F4, F5 *
     * ======================================================================*
     */

    /*
     * F1 : gestion des enseignants-chercheurs suiveurs UTT
     * ----------------------------------------------------
     * Un responsable de programme inscrit des enseignants-chercheurs comme suiveur de stage pour son programme
     */
    // Le responsable d'un programme ajoute un suiveur à sa liste...
    @Override
    public void addSuiveur(Enseignantsuiveur suiveur) {
        Integer id = suiveurFacade.count() + 2;

        suiveur.setId(id);
        suiveur.setNom(suiveur.getNom());
        suiveur.setPrenom(suiveur.getPrenom());
        suiveur.setBureau(suiveur.getBureau());
        suiveur.setEmail(suiveur.getEmail());

        suiveurFacade.create(suiveur);
    }

    // Suppression d'un suiveur...
    @Override
    public void delSuiveur(Integer id) {
        Enseignantsuiveur suiveur = suiveurFacade.find(id);
        suiveurFacade.remove(suiveur);
    }

    // Visualisation des données d'un enseignant suiveur d'un programme
    @Override
    public Enseignantsuiveur listSuiveurData(Integer id) {
        Enseignantsuiveur suiveur = suiveurFacade.find(id);
        suiveur.getId();
        suiveur.getNom();
        suiveur.getPrenom();
        suiveur.getBureau();
        suiveur.getEmail();

        return suiveur;
    }

    // Affichage de la liste des suiveurs
    @Override
    public List<Enseignantsuiveur> listSuiveur() {
        return suiveurFacade.findAll();
    }

    /*
     *  F2 : gestion des étudiants
     *  --------------------------
     *  Un responsable de programme autorise les étudiants de son programme à partir en stage
     */
    /*  Un responsable de programme ajoute un étudiant qui est autorisé à partir en stage
     *  A la création d'un nouvel étudiant, les identifiants de stage et de suiveur sont mis à null (default)
     *  Ils verront leur valeur changer lorsqu'un suiveur ou un stage sera attribué à l'étudiant
     */
    @Override
    public void addEtu(Etudiants etu) {
        //etu = new Etudiants();
        Integer autorisation = 0;
        Integer id = etudiantFacade.count() + 1;

        etu.setId(id);
        etu.setNom(etu.getNom());
        etu.setPrenom(etu.getPrenom());
        etu.setAutorisation(autorisation);

        etudiantFacade.create(etu);
    }

    // Suppression d'un étudiant
    @Override
    public void delEtu(Integer id) {
        Etudiants etu = etudiantFacade.find(id);
        etudiantFacade.remove(etu);
    }

    // Visualisation des données d'un étudiant
    @Override
    public Etudiants listEtuData(Integer id) {
        Etudiants etu = etudiantFacade.find(id);
        etu.getId();
        etu.getNom();
        etu.getPrenom();
        etu.getAutorisation();
        etu.getIdStage();
        etu.getIdSuiveur();

        return etu;
    }

    /* Visualisation de l'ensemble des étudiants autorisés à partir en stage
     * (i.e. ceux dont la valeur de l'autorisation est égale à 1)
     */
    @Override
    public List<Etudiants> listEtuOK(Integer autorisation) {
        Query q = em.createNamedQuery("SELECT e FROM Etudiants e WHERE e.autorisation = :autorisation");
        q.setParameter("autorisation", autorisation);

        // Execution de la requete, puis renvoi du résultat...
        return q.getResultList();
    }

    /*
     * Visualisation des étudiants par type de stage (TN09 ou TN10)
     */
    @Override
    public List<Etudiants> listEtuByStageType(String type) {
        /*
         * On récupère tous étudiants en fonction du type de stage (Table Stages)...
         * La requete nommée se situe dans l'Entité Beans Etudiants
         */
        Query q = em.createNamedQuery("SELECT e FROM Etudiants e WHERE e.id_stage IN(SELECT id FROM Stages s WHERE s.type = :type)");
        q.setParameter(type, type);

        return q.getResultList();
    }

    @Override
    public List<Etudiants> listEtuByStageNOK() {
        Query q  = em.createNamedQuery("SELECT * FROM Etudiants WHERE id_stage IS NULL");
        return q.getResultList();
    }

    @Override
    public List<Etudiants> listEtu() {
        return etudiantFacade.findAll();
    }

    @Override
    public int getTotalEtu() {
        return etudiantFacade.count();
    }

    @Override
    public int getTotalSuiveur() {
        return suiveurFacade.count();
    }

    @Override
    public List<Etudiants> findByValeur(String valeur) {
        Query q = em.createNamedQuery("SELECT o FROM Etudiants o WHERE o.valeur LIKE:valeur");
        q.setParameter("valeur", valeur);

        // Execution de la requete, puis renvoi du résultat...
        return q.getResultList();
    }

    public List<Stages> findByValeur2(String valeur) {
        Query q = em.createNamedQuery("SELECT o FROM Stages o WHERE o.valeur LIKE:valeur");
        q.setParameter("valeur", valeur);

        // Execution de la requete, puis renvoi du résultat...
        return q.getResultList();
    }


}
